package com.datalook;

import cn.hutool.core.io.FileUtil;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.FileFilter;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MarkdownParser {

    // 正则表达式：以1-3位数字开头，后面跟一个点，并且这个点后不是数字
    private static final String NUMBER_DOT_REGEX = "^\\d{1,3}\\.(?!\\d)";

    /**
     * 检查给定的字符串是否以1到3位数字开头并紧跟一个点，且点后不跟随数字。
     *
     * @param input 要检查的字符串
     * @return 如果字符串匹配模式，则返回true；否则返回false。
     */
    public static boolean matchesNumberDotPattern(String input) {
        if (input == null || input.isEmpty()) {
            return false;
        }
        Pattern pattern = Pattern.compile(NUMBER_DOT_REGEX);
        Matcher matcher = pattern.matcher(input);
        return matcher.find();
    }

    public static void main(String[] args) {
        List<File> files = FileUtil.loopFiles("/Users/hulan/Downloads/年度任务 2/2024/工作整理", new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".md");
            }
        });

        StringBuilder all = new StringBuilder();
        for (File file : files) {
            // 模拟输入文本
            List<String> lines = FileUtil.readLines(file, StandardCharsets.UTF_8);
            StringBuilder fileCsv = new StringBuilder();
            for (int i = 0; i < lines.size(); i++) {
                String line = lines.get(i);
                StringBuilder blockCsv = new StringBuilder();
                if (line.startsWith("### ")) {
                    // 拼接名字
                    i++;
                    String name = line.substring(3);
                    for (; i < lines.size(); i++) {
                        line = lines.get(i);
                        if (StringUtils.hasText(line)) {
                            if (matchesNumberDotPattern(line)) {
                                StringBuilder lineCsv = new StringBuilder();
                                lineCsv.append(file.getName()).append(",").append(name).append(",");
                                // 匹配到
                                // 拼接内容
                                lineCsv.append("\"").append(line).append("\"").append(",");
                                // 拼接标签
                                extractMarkdownLinks(lineCsv, line);
                                appendLine(blockCsv, lineCsv);
                            } else {
                                if (line.startsWith("### ")) {
                                    // 一个新的
                                    i--;
                                    break;
                                }
                            }
                        }
                    }
//                    System.out.println(blockCsv);
                    appendLine(fileCsv, blockCsv);
                }
            }
//            System.out.println("========================");
//            System.out.println("========================");
//            System.out.println("======    file   =======");
//            System.out.println("========================");
//            System.out.println("========================");
//            System.out.println(fileCsv);
            appendLine(all, fileCsv);
        }
//        System.out.println("========================");
//        System.out.println("========================");
//        System.out.println("========================");
//        System.out.println("========================");
//        System.out.println("========================");
        System.out.println(all);

//
//        // 保存为CSV文件
//        try (FileWriter writer = new FileWriter("output.csv")) {
//            // 写入表头
//            writer.write(String.join(",", columns) + "\n");
//
//            // 写入数据行
//            for (Map<String, String> row : data) {
//                List<String> line = new ArrayList<>();
//                for (String column : columns) {
//                    line.add(row.getOrDefault(column, "").replace(",", "\\,")); // 转义逗号
//                }
//                writer.write(String.join(",", line) + "\n");
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }

    // 1. 0003管理员派单偶尔提示报错排查，完成（偶尔出现，可能是网络问题）[【非bug](【非bug.md)​[【报修](【报修.md)
    public static void extractMarkdownLinks(StringBuilder sb, String input) {
        if (input.equals("")) {
            return;
        }
        int index = input.indexOf("(【");
        if (index == -1) {
            return;
        }
        if (sb.length() > 0) {
            sb.append(",");
        }
        int length = input.length();
        for (int i = index + 2; i < length; i++) {
            char c = input.charAt(i);
            if (input.charAt(i) == '.') {
                if (input.length() < (i + 3)) {
                    break;
                }
                if (input.substring(i, i + 3).equals(".md")) {
                    String other = input.substring(i + 3);
                    extractMarkdownLinks(sb, other);
                    break;
                }
            } else {
                sb.append(c);

            }
        }
    }

    public static void appendLine(StringBuilder sb, StringBuilder line) {
        if (sb.length() > 0) {
            sb.append("\n");
        }
        sb.append(line);
    }
}